﻿#pragma once

#include <cstdint>
#include <string>
#include <vector>

#include "SimEnvIF.h"
#include "SimDriveImpl.h"
#include "RecorderIF.h"

void startSimulation(void);

class SimEnv :public SimEnvIF
{
public:
    SimEnv() = default;
    ~SimEnv() = default;

    void simEnvConfig(std::string& configFileName, uint32_t& dataPoolSize);


    void calcDriveSignalTimeQueue(const std::vector<uint64_t>& originalTimeQueue, const std::vector<double>& originalDataQueue, std::vector<uint64_t>& desiredTimeQueue, std::vector<double>& desiredDataQueue);


    void add_NodeSignal(std::vector<std::string>& nodeSignals);
    void init_NodeData(void);
    void mapping_NodeData(const SimSignalData& simSignalData, const uint32_t index);

    
    void algorithm_init(void);
    //@param readerIndex 当前仿真周期仿真数据在数据池中位置
    //@param driveSignal 当前仿真周期驱动信号值；该信号最好是 uint64数据类型 一直累加的 和算法调度频率一致 这样便于后期debug调试（通过该信号同步实车与仿真）
    //@param timeStamp 当前仿真周期数据所对应的时间戳 通过差分该信号 计算系统调度周期 用于算法中带时间积分量 unit ns
    //@param dataFrameIndex 当前仿真数据中在抽帧结果中索引值
    //@param timeSlice 标签算子
    void algorithm_proc(const uint32_t readerIndex, const double driveSignal, const uint64_t timeStamp, const uint32_t dataFrameIndex, std::vector<Mf4Recorder::TimeSlice>& timeSlice);
    void algorithm_destroy(void);


    void addSignal_recorder(uint32_t& port, std::vector<Mf4Recorder::SignalBaseInfo>& recorderSignal);
};
